package com.autotest.nore.common.utils;

import com.autotest.nore.service.RunService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

public final class EmailUtils {
    // 邮件服务器配置
    private static final String DEFAULT_SMTP_SERVER = "";
    private static final int DEFAULT_SMTP_PORT = 25;
    private static final Logger logger = LoggerFactory.getLogger(EmailUtils.class);

    // 私有构造函数防止实例化
    private EmailUtils() {
        throw new UnsupportedOperationException("这是一个工具类，不能实例化");
    }

    /**
     * 发送邮件
     * @param from 发件人地址
     * @param to 收件人地址（多个用逗号分隔）
     * @param cc 抄送地址（多个用逗号分隔，可为空）
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param isHtml 是否为HTML格式
     * @throws MessagingException 邮件发送异常
     */
    public static void sendEmail(String from, String to, String cc,
                                 String subject, String content, boolean isHtml)
            throws MessagingException {
        logger.info("邮件服务器地址"+DEFAULT_SMTP_SERVER+",端口号"+DEFAULT_SMTP_PORT);
        sendEmail(DEFAULT_SMTP_SERVER, DEFAULT_SMTP_PORT, from, to, cc, subject, content, isHtml);
    }

    /**
     * 发送邮件（可自定义SMTP服务器）
     * @param smtpServer SMTP服务器地址
     * @param smtpPort SMTP端口
     * @param from 发件人地址
     * @param to 收件人地址（多个用逗号分隔）
     * @param cc 抄送地址（多个用逗号分隔，可为空）
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param isHtml 是否为HTML格式
     * @throws MessagingException 邮件发送异常
     */
    public static void sendEmail(String smtpServer, int smtpPort,
                                 String from, String to, String cc,
                                 String subject, String content, boolean isHtml)
            throws MessagingException {

        // 设置邮件属性
        Properties props = new Properties();
        props.put("mail.smtp.host", smtpServer);
        props.put("mail.smtp.port", smtpPort);
        props.put("mail.smtp.auth", "false"); // 无需认证
        // 启用 TLS 加密的关键配置
        props.put("mail.smtp.starttls.enable", "true");  // 启用 STARTTLS
        props.put("mail.smtp.starttls.required", "true"); // 强制要求 TLS
        props.put("mail.smtp.ssl.protocols", "TLSv1.2");

        // 创建会话
        Session session = Session.getInstance(props);

        try {
            // 创建MimeMessage对象
            MimeMessage message = new MimeMessage(session);

            // 设置发件人
            message.setFrom(new InternetAddress(from));

            // 设置收件人
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));

            // 设置抄送
            if (cc != null && !cc.trim().isEmpty()) {
                message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
            }

            // 设置主题
            message.setSubject(MimeUtility.encodeText(subject, "UTF-8", "B"));

            // 设置邮件内容
            if (isHtml) {
                message.setContent(content, "text/html; charset=utf-8");
            } else {
                message.setText(content, "UTF-8");
            }

            // 发送邮件
            Transport.send(message);

        } catch (AddressException e) {
            throw new MessagingException("邮件地址格式错误", e);
        } catch (MessagingException | UnsupportedEncodingException e) {
            throw new MessagingException("邮件发送失败", e);
        }
    }

    /**
     * 简化版发送纯文本邮件
     * @param from 发件人地址
     * @param to 收件人地址
     * @param subject 邮件主题
     * @param content 邮件内容
     * @throws MessagingException 邮件发送异常
     */
    public static void sendTextEmail(String from, String to, String subject, String content)
            throws MessagingException {
        logger.info("发件人"+from+",收件人"+to+",主题"+subject+",内容"+content);
        sendEmail(from, to, null, subject, content, false);
    }

    /**
     * 简化版发送HTML邮件
     * @param from 发件人地址
     * @param to 收件人地址
     * @param subject 邮件主题
     * @param content HTML内容
     * @throws MessagingException 邮件发送异常
     */
    public static void sendHtmlEmail(String from, String to, String subject, String content)
            throws MessagingException {
        sendEmail(from, to, null, subject, content, true);
    }


    public static void main(String[] args) {
        try {
            sendTextEmail(
                    "",
                    "",
                    "自动化测试报告",
                    "执行失败，报告"
            );
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}
